cmake_minimum_required(VERSION 3.18)
project(hpc_example LANGUAGES CXX CUDA)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CUDA_STANDARD 11)

# 指定 CUDA 相关编译选项
set(CMAKE_CUDA_ARCHITECTURES 75 80 87)  # 适用于 Turing (75) 和 Ampere (80)
set(CMAKE_CUDA_SEPARABLE_COMPILATION ON)

find_package(CUDA REQUIRED)
find_package(OpenCV REQUIRED)


include_directories(
    ${CUDA_INCLUDE_DIRS}
    ${OpenCV_INCLUDE_DIRS}
)

# 静态库会存放在 /datas/xk/02code/hpc/cuda/build/lib
# 动态库会存放在 /datas/xk/02code/hpc/cuda/build/lib
# 可执行文件会存放在 /datas/xk/02code/hpc/cuda/build/bin


set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)


# 代表 CMake 项目的根目录（通常是 CMakeLists.txt 所在目录）。
# 这样，所有子目录的 C++/CUDA 代码都可以直接 #include 根目录下的头文件。
# 让 CMake 在 CUDA SDK 的 include 目录 里查找头文件（比如 cuda_runtime.h）。
# CUDA_PATH 一般指向 /usr/local/cuda（Linux）或 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA（Windows）。

set(COMMON_HEADER_DIRS
  ${PROJECT_SOURCE_DIR}
  ${CUDA_PATH}/include
)

# 指定 CUDA 库的存放路径，通常是 /usr/local/cuda/lib64，其中存放了 libcudart.so、libcublas.so 等动态库。
set(COMMON_LIB_DIRS
  ${CUDA_PATH}/lib64
  ${OpenCV_LIBS}
)

include_directories(
  ${COMMON_HEADER_DIRS}
)

# link_directories() 指定了 CUDA 的库路径，使得后续 target_link_libraries() 能正确链接 CUDA 相关的 .so 文件。

link_directories(
  ${COMMON_LIB_DIRS}
)

# 添加子目录
add_subdirectory(src)
add_subdirectory(test)

# # 生成最终可执行文件
# add_executable(hpc_example src/main.cpp)

# # 链接子模块库
# target_link_libraries(hpc_example PRIVATE add utils)

# # 头文件路径
# target_include_directories(hpc_example PRIVATE src/common)
